// File Name: step_motor_ctrl.c
// Author: kukukukuku~
// Date: 2024-06-28

#include "./User/Step_Motor/inc/step_motor_ctrl.h"

StepMotorState stepMotorState;  //Step_Motor状态
StepMotorMode stepMotorMode;    //Step_Motor模式
uint8_t stepMotorSpd;           //Step_Motor转速

/**
 * @brief   Step_Motor初始化
 * @param   None
 * @retval  None
 * @note    静态函数
*/
static void step_motor_init(void)
{
    gpio_init_type gpioInitStruct = 
    {
        .gpio_pins           = STEP_MOTOR_EN_GPIO_PIN,
        .gpio_out_type       = GPIO_OUTPUT_PUSH_PULL,
        .gpio_pull           = GPIO_PULL_NONE,
        .gpio_mode           = GPIO_MODE_OUTPUT,
        .gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER,
    };
    
    tmr_output_config_type tmrOutputConfigStruct = 
    {
        .oc_mode         = TMR_OUTPUT_CONTROL_PWM_MODE_A,
        .oc_idle_state   = FALSE,
        .oc_polarity     = TMR_OUTPUT_ACTIVE_HIGH,
        .oc_output_state = TRUE,
    };
    
    //Step_Motor GPIO初始化
    crm_periph_clock_enable(STEP_MOTOR_GPIO_CRM1, TRUE);
    crm_periph_clock_enable(STEP_MOTOR_GPIO_CRM2, TRUE);
    gpio_init(STEP_MOTOR_EN_GPIO_PORT, &gpioInitStruct);
    gpioInitStruct.gpio_pins = STEP_MOTOR_MS1_GPIO_PIN;
    gpio_init(STEP_MOTOR_MS1_GPIO_PORT, &gpioInitStruct);
    gpioInitStruct.gpio_pins = STEP_MOTOR_MS2_GPIO_PIN;
    gpio_init(STEP_MOTOR_MS2_GPIO_PORT, &gpioInitStruct);
    gpioInitStruct.gpio_pins = STEP_MOTOR_MS3_GPIO_PIN;
    gpio_init(STEP_MOTOR_MS3_GPIO_PORT, &gpioInitStruct);
    gpioInitStruct.gpio_pins = STEP_MOTOR_DIR_GPIO_PIN;
    gpio_init(STEP_MOTOR_DIR_GPIO_PORT, &gpioInitStruct);
    gpioInitStruct.gpio_mode = GPIO_MODE_MUX;
    gpioInitStruct.gpio_pins = STEP_MOTOR_PUL_GPIO_PIN;
    gpio_init(STEP_MOTOR_PUL_GPIO_PORT, &gpioInitStruct);
    gpio_pin_mux_config(STEP_MOTOR_PUL_GPIO_PORT, STEP_MOTOR_PUL_GPIO_MUX_SOURCE, STEP_MOTOR_PUL_GPIO_MUX);
    
    //Step_Motor TMR初始化
    crm_periph_clock_enable(STEP_MOTOR_PUL_TMR_CRM, TRUE);
    tmr_base_init(STEP_MOTOR_PUL_TMR, STEP_MOTOR_PUL_TMR_PR, STEP_MOTOR_PUL_TMR_DIV);
    tmr_cnt_dir_set(STEP_MOTOR_PUL_TMR, TMR_COUNT_UP);
    tmr_clock_source_div_set(STEP_MOTOR_PUL_TMR, TMR_CLOCK_DIV1);
    tmr_period_buffer_enable(STEP_MOTOR_PUL_TMR, TRUE);
    tmr_output_channel_config(STEP_MOTOR_PUL_TMR, STEP_MOTOR_PUL_TMR_CH, &tmrOutputConfigStruct);
    tmr_channel_value_set(STEP_MOTOR_PUL_TMR, STEP_MOTOR_PUL_TMR_CH, STEP_MOTOR_PUL_TMR_PULSE);
    tmr_output_channel_buffer_enable(STEP_MOTOR_PUL_TMR, STEP_MOTOR_PUL_TMR_CH, FALSE);
    tmr_output_enable(STEP_MOTOR_PUL_TMR, TRUE);
    tmr_counter_enable(STEP_MOTOR_PUL_TMR, FALSE);
}


/**
 * @brief   Step_Motor配置
 * @param   None
 * @retval  None
 * @note    None
*/
void step_motor_config(void)
{
    step_motor_init();
    
    STEP_MOTOR_ENA;
    STEP_MOTOR_MS1_L;
    STEP_MOTOR_MS2_L;
    STEP_MOTOR_MS3_L;
    STEP_MOTOR_DIR_CW;
}
